// api/index.js
import axios from 'axios';

// 设置请求的基础路径（base URL），在开发环境中会被 vue.config.js 的 devServer.proxy 代理
const baseUrl = process.env.NODE_ENV === 'development' ? GeneralConfiguration.baseUrl.dev : GeneralConfiguration.baseUrl.pro;
// 打印当前环境、服务地址等信息到控制台，方便调试
console.info("运行环境：" + process.env.NODE_ENV, "服务地址：" + baseUrl, "版本信息：" + GeneralConfiguration.version);

// 创建一个 axios 实例，配置通用请求参数
const service = axios.create({
    baseURL: baseUrl, // 请求的基础路径，注意这里是 baseURL（拼写要正确）
    timeout: 10000,    // 请求超时时间（单位：毫秒）
    headers: {
        // 默认请求头 Content-Type
        'Content-Type': 'application/json; charset=utf-8'
    }
});

// 添加响应拦截器（所有通过该 service 发起的请求都会经过这里）
service.interceptors.response.use(
    // 响应成功时的处理函数
    response => {
        // 获取响应中的 data 数据（即后端返回的数据）
        let res = response.data;

        // 判断是否存在业务状态码（如 code 字段）
        if (res.code) {
            // 打印请求地址、请求参数、请求体以及响应结果，便于调试
            console.log("[" + response.config.url + "]",
                response.config.params || '',
                response.config.data || '',
                res);

            // 如果业务状态码为 200 表示请求成功，直接返回响应
            if (res.code === 200) {
                return response;
            } else {
                // 否则表示业务失败，使用 Promise.reject 抛出错误信息
                return Promise.reject(response.data.msg);
            }
        } else {
            // 如果没有业务状态码（例如纯数据接口），直接返回原始响应
            return response;
        }
    },
    // 响应异常时的处理函数（网络错误、4xx、5xx 等）
    error => {
        // 打印错误请求的完整 URL 地址
        console.error("response error：[" + error.response?.request?.responseURL + "]");

        // 如果错误响应中包含 data 数据，则将其中的 msg 作为错误信息
        if (error.response?.data) {
            error.message = error.response.data.msg;
        }

        // 返回被拒绝的 Promise，以便上层调用者捕获错误
        return Promise.reject(error);
    }
);

// 导出 baseUrl 和 service 实例，供其他模块引入使用
export default {baseUrl, service};